#include "categorieitem.h"

CategorieItem::CategorieItem(CategorieItem *parent) :
    QObject(parent)
{
    id = 0;
    ordre = 0;
    nom = "Catégories";
    parentIt = parent;
    enfants.clear();
}

CategorieItem::~CategorieItem(){
    for(int i=0 ; i < enfants.count() ; i++){
        delete enfants[i];
    }
}

void CategorieItem::construireArbre(QSqlDatabase db , int identifiant)
{
    id = identifiant;
    QSqlQuery q(db);
    q.prepare("SELECT nom, ordre FROM categories WHERE id = :i");
    q.bindValue(":i",identifiant);
    q.exec();
    if(q.first()){
        nom = q.value(0).toString();
        ordre = q.value(1).toInt();
    }

    q.finish();

    if(identifiant == 0){
        q.exec("SELECT id FROM categories WHERE isnull(parent) ORDER BY ordre");
    } else {
        q.prepare("SELECT id FROM categories WHERE parent = :n ORDER BY ordre");
        q.bindValue(":n",identifiant);
        q.exec();
    }


    while(q.next()){
        CategorieItem *enfant = new CategorieItem(this);
        enfant->construireArbre(db,q.value(0).toInt());
        enfants.append(enfant);
    }

    q.finish();


}

int CategorieItem::numRow()
{
    return enfants.count();
}

int CategorieItem::getId()
{
    return id;
}

int CategorieItem::row()
{
    return ordre;
}

QVariant CategorieItem::data() const
{
    return QVariant(nom);
}

CategorieItem *CategorieItem::getParent()
{
    return parentIt;
}

CategorieItem *CategorieItem::enfant(int row)
{
    return enfants.at(row);
}

CategorieItem *CategorieItem::lastChildren()
{
    if(numRow() == 0){
        return this;
    } else {
        return enfants.at(numRow()-1)->lastChildren();
    }
}

bool CategorieItem::setData(const QVariant &value)
{
    nom = value.toString();
}

void CategorieItem::insertEnfant(int position, int identifiant)
{
    // On crée un enfant
    CategorieItem *tmp = new CategorieItem(this);
    tmp->id = identifiant;
    tmp->ordre = position;

    // On décale les autres
    for(int i = position; i< enfants.count(); i++){
        enfants.at(i)->ordre = i + 1;
    }

    // On l'inclut à la position
    enfants.insert(position,tmp);
}

void CategorieItem::insertEnfant(int position, CategorieItem *e)
{
    // On décale les autres
    for(int i = position; i< enfants.count(); i++){
        enfants.at(i)->ordre = i + 1;
    }

    // On l'inclut à la position
    e->ordre = position;
    e->parentIt = this;
    enfants.insert(position,e);


}

void CategorieItem::swap(int prev, int next)
{
    // Inverse deux item

    enfant(prev)->ordre = next;
    enfant(next)->ordre = prev;
    enfants.swap(prev,next);

}

CategorieItem *CategorieItem::retirerDernier()
{
    return enfants.takeLast();
}



